package 网络编程.tcp通信群聊案例;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
import static 网络编程.tcp通信群聊案例.服务端.在线用户;
public class 服务端接收线程 extends Thread {
    //接收服务端传来的通信管道
    //先得到这个通信管道对应的字节输入流
    //再包装成数据输入流
    //写一个死循环用于不断从客户接收数据
    //每当接收到一条消息,就先把消息输出到服务端,然后再发送到所有的客户端
    //如果出现异常,说明这个通信管道那头的客户端下线了,就要关掉这个管道(数据输入流也要关掉),并且从在线用户里删掉
    //然后就break,这个对应那个客户的线程也就结束了
    //那个群发功能就是遍历在线用户数组,把数据包装成数据输出流,然后发给每个客户的同心管道
    public Socket 通信管道;
    public 服务端接收线程(Socket 通信管道) {
        this.通信管道 = 通信管道;
    }
    @Override
    public void run() {
        try {
            InputStream 字节输入流=通信管道.getInputStream();
            DataInputStream 数据输入流=new DataInputStream(字节输入流);
            while(true){
                try {
                    String 数据 = 数据输入流.readUTF();
                    System.out.println(数据);
                    群发(数据);
                } catch (Exception e) {
                    System.out.println(通信管道.getRemoteSocketAddress()+"下线了");
                    在线用户.remove(通信管道);
                    数据输入流.close();
                    通信管道.close();
                    break;
                }
            }
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
    private void 群发(String 数据) throws IOException {
        for (Socket 通道 : 在线用户) {
            DataOutputStream 数据输出流=new DataOutputStream(通道.getOutputStream());
            数据输出流.writeUTF(数据);
            数据输出流.flush();
        }
    }
}
